// 配置文件
// const env = require('../config/config.js')
import {
	GetStsTemp
} from "@/api/modules/system";

// 签名算法库
import Base64 from "./libs/Base64.js"
import a from './libs/hmac.js'
import b from './libs/sha1.js'
import Crypto from "./libs/crypto.js"

/**
 * 通用上传器
 * @description 接收临时路径上传到oss,各平台根据不同的选择文件api获取临时路径
 * @param {String} filePath - 临时路径(例如: http://tmp/24f3.png)
 * @param {String} suffix - 后缀名称(例如: png)
 * @param {String} folderType - 创建文件夹类型(非通用: 1-上传头像;2-申请验收/申请异常/申请撤销;3-系统消息;4-投诉;5-账号申诉)
 * @param {Function} success - 成功回调
 * @param {Function} fail - 失败回调
 * @return void
 */
const uploadFile = function(params) {
	// 这里可以做一些文件判断及错误处理
	// 如果文件不合规,直接返回return结束函数不要往下走
	GetStsTemp({
		tag: params.folderType
	}).then(result => {
		uni.showLoading({
			mask: true,
			title: "加载中..."
		})
		const env = result.data
		let suffix = params.suffix
		// #ifdef APP
		let suffixTemp = params.filePath
		suffix = suffixTemp.substring(suffixTemp.lastIndexOf(".") + 1, suffixTemp.length)
		// #endif

		// 设置文件上传至OSS后的文件路径(根据需求进行拼接url)
		const aliyunFileKey = suffix ?
			`${suffix.indexOf(".") > -1 ? env.dir + suffix : env.dir + "." + suffix}` : env.dir;

		// 设置参数数据及算法
		const aliyunServerURL = env.endpoint;
		const accessid = env.accessKeyId;
		const policyBase64 = getPolicyBase64(env);
		const signature = getSignature(policyBase64, env);

		uni.uploadFile({
			url: aliyunServerURL, //阿里云OSS地址(支持自定义域名)
			filePath: params.filePath, //临时路径
			name: 'file', //固定写法
			formData: { //要的参数,详见文档
				'key': aliyunFileKey,
				'policy': policyBase64,
				'OSSAccessKeyId': accessid,
				'signature': signature,
				'success_action_status': '200',
				"x-oss-security-token": env.securityToken
			},
			// 上传成功
			success: (res) => {
				// 失败回调
				if (res.statusCode != 200) {
					if (params.fail) {
						params.fail(res)
					}
					return;
				}
				// 成功回调
				if (params.success) {
					// 把你想扔出去的参数写里
					console.log(res, '￥￥￥￥￥￥￥￥￥￥￥￥￥￥￥');
					// params.success(aliyunFileKey);
					params.success("/" + aliyunFileKey);
				}
			},
			// 上传失败
			fail: (err) => {
				err.wxaddinfo = aliyunServerURL;
				if (params.fail) {
					params.fail(err)
				}
			},
			complete() {
				uni.hideLoading()
			}
		})
	})

}

const getPolicyBase64 = function(env) {
	// let date = new Date();
	// date.setHours(date.getHours() + env.Expiration);
	// let srcT = date.toISOString();
	let srcT = env.Expiration

	// console.log(srcT, "srcTsrcTsrcTsrcT");

	const policyText = {
		"expiration": srcT, //设置该Policy的失效时间
		"conditions": [
			["content-length-range", 0, 30 * 1024 * 1024] // 设置上传文件的大小限制,30mb
		]
	};
	const policyBase64 = Base64.encode(JSON.stringify(policyText));
	return policyBase64;
}

const getSignature = function(policyBase64, env) {
	const accesskey = env.accessKeySecret;
	const bytes = Crypto.HMAC(Crypto.SHA1, policyBase64, accesskey, {
		asBytes: true
	});
	const signature = Crypto.util.bytesToBase64(bytes);
	return signature;
}

export default uploadFile;